/**
 * 
 */
package ar.edu.ufasta.presupuestos.servicios.inventario;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import ar.edu.ufasta.presupuestos.logica.aplicativo.Constantes;
import ar.edu.ufasta.presupuestos.logica.entidades.articulo.Articulo;
import ar.edu.ufasta.presupuestos.servicios.persistencia.ObjectID;
import ar.edu.ufasta.presupuestos.servicios.persistencia.PersistenceFacade;
import ar.edu.ufasta.presupuestos.servicios.persistencia.ColumnMapper.ColumnNameMapperFacade;

/**
 * @author Carlos
 *
 */
public class Inventario {
	
	private PersistenceFacade persistenceFacade;

	private Map<String, String> column;
	
	/*
	 * Constructor
	 */
	@SuppressWarnings("unchecked")
	public Inventario(){
//		PersistenceBrokerCarlos pers = PersistenceBrokerCarlos.getInstancia();
		column = ColumnNameMapperFacade.getInstancia().getColumnNames(
				Articulo.class);
		this.persistenceFacade = PersistenceFacade.getInstance();
	}
	
	
//	// TODo : Juan, aca especifico el tipo del articulo sino no se que tipo
//	// de articulo crear, recordar que Articulo es clase abstracta.
//	public void removeArticulo(ObjectID articuloId, int tipoArt){
//		Articulo art;
//		switch (tipoArt) {
//		case 1:
//			art = new ArticuloSimple();
//			break;
//		case 2:
//			art = new ArticuloComplejo();
//			break;
//		case 3:
//			art = new Servicio();
//			break;
//		default:
//			art = new ArticuloSimple();
//			break;
//		}
////		art.setId(articuloId);
////		this.articulos.remove(art);
//	}
	

	
	
	// Comentado - Se obtiene el articulo de BD directamente
	/*
	public Object[] getArticulo(ObjectID IDArticulo){
		
		Articulo articuloAct = null;
	
		Articulo simple = new ArticuloSimple();
		simple.setId(IDArticulo);
		
		if (articulos.contains(articuloAct)){
			int index = this.articulos.indexOf(simple);
			articuloAct = this.articulos.get(index);
		}else{
			Articulo complex = new ArticuloComplejo();
			complex.setId(IDArticulo);
			if (articulos.contains(articuloAct)){
				int index = this.articulos.indexOf(complex);
				articuloAct = this.articulos.get(index);
			}else{
				Articulo servicio = new Servicio();
				servicio.setId(IDArticulo);
				if (articulos.contains(articuloAct)){
					int index = this.articulos.indexOf(servicio);
					articuloAct = this.articulos.get(index);
				}
			}
		}
		return articuloAct;
	}*/
	
	@SuppressWarnings("unchecked")
	public List<Articulo> getAllArticulo(){
		return (List<Articulo>) PersistenceFacade.getInstance().search(Articulo.class, null);
	}
	
	
	// Debita stock del inventario
	public int setStock(Articulo articulo, Integer quantity){
		Integer ret;
		Map<String, String> condition = new HashMap<String, String>();
		
		if(quantity <0){
			ret = Constantes.ERROR_CON_REMITOS.getValue();
			quantity =0;
		}else{
			ret=  Constantes.OPERACION_OK.getValue();
		}
		
		condition.put(this.column.get("stock"), quantity.toString());		
		this.persistenceFacade.update(Articulo.class, articulo.getOid(), condition);
		
		return ret;
	}
	
	
	// Debita stock del inventario
	public int stockAjustement(Articulo articulo, Integer quantity){
		Integer ret = 0;
		
		Map<String, String> condition = new HashMap<String, String>();
		Integer originalStock = articulo.getStock();
		Integer coverStock = originalStock - articulo.getCantidadMinima();
		
		//Integer newStock = originalStock + quantity;
		Integer newStock = coverStock + quantity;
		
		if(newStock < 0){
			ret = Math.abs(newStock);
			newStock = articulo.getCantidadMinima(); //Math.abs(newStock);
		}else{
			ret= 0;//  Constantes.OPERACION_OK.getValue();
			newStock = originalStock + quantity;
		}
		
		condition.put(this.column.get("stock"), newStock.toString());		
		this.persistenceFacade.update(Articulo.class, articulo.getOid(), condition);
		
		return ret.intValue();
		
	}
	
	public Articulo getArticulo(ObjectID oid){
		return (Articulo) this.persistenceFacade.get(oid, Articulo.class);
	}

	public Integer getStock(Articulo articulo) {
		Integer stock = null;
		ObjectID oid = articulo.getOid();
		if (oid != null) {
			Map<String, String> condition = new HashMap<String, String>();
			condition.put("column", this.column.get("stock"));
			condition.put("id", oid.getId().toString());
			stock = this.persistenceFacade.getInteger(Articulo.class, condition);
		}
		return stock;
	}
	
	
}
